Regressão (simples, múltiplas, logística)

Regressão Linear Simples

Modelos de regressão, são modelos matemáticos que relacionan o comportamento de uma variável Y com outra X, a variável X é a variável independente, que são as entradas do modelo, a variável Y é a variável dependente, que é saída do modelo.O modelo é chamado de simples quando envolve apenas duas variáveis e múltiplo quando possui mais de duas variavéis.

Uma variável independente x, explica a variação em outra variável, que é chamada de variável dependente Y. Este relacionamento existe em apenas um direção.

variável independente (x) -> variável dependente (y)

Análise de regressão é uma metodologia estatística que utiliza a relaçao entre duas ou mais variáveis quantitativas de tal forma que uma variável possa ser predita a partir de outra.

O objetivo da regressão linear é buscar a equação de uma linha de regressão que minimize a soma dos erros ao quadrado, da diferença entre o valor observado de Y e o valor previsto.

Fórmula da regressão

Fórmulas que ajudam a explicar o modelo de regressão:

(SST - Sum Square Total) Soma total dos quadrados, mostra a variação em Y em torno da própria média, o nível do modelo de regressão. É a medida da variação total.

(SSR - Sum Square Regression) Soma dos quadrados de regressão, oferece a variação de Y considerando as variáveis X utilizadas no modelo. É a medida da variação que pode ser explicada.

(SSE - Sum Square Error) Soma dos quadrados dos residuos, mostra a variação de Y que não é explicada pelo modelo elaborado. É a medida da variação que não pode ser explicada.

SST = SSE + SSR

Se o SSR é alto e o SSE é baixo, o modelo de regressão explica a variação nas previçoes.

Se o SSR é baixo de o SSE é alto, o modelo de regressão não explica bem a variação nas previsões.

Cost Function

O objetivo da regressão linear é a busca de uma linha de regressão que minimize a soma dos erros ao quadrado, da diferença entre o valor observado Y e o valor previsto.

Existem alguns métodos para minimização da Cost Function tais como:

  • Pseudo-inversão
  • Fatorização
  • Gradient Descent

In [1]:
from sklearn import linear_model
from sklearn.datasets import load_boston
boston_dataset = load_boston()

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

dataset = pd.DataFrame(data=boston_dataset.data, columns=boston_dataset.feature_names)
dataset['target'] = boston_dataset.target

dataset.head(5)


Out[1]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT target
0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14 21.6
2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 17.8 392.83 4.03 34.7
3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94 33.4
4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 18.7 396.90 5.33 36.2

In [2]:
# print(boston.DESCR)

In [3]:
from scipy.stats.stats import pearsonr
print('Correlação: %0.5f' % pearsonr(dataset['RM'], dataset['target'])[0])


Correlação: 0.69536

In [4]:
x_range = [dataset['RM'].min(),dataset['RM'].max()]
y_range = [dataset['target'].min(),dataset['target'].max()]

print(x_range)
print(y_range)


[3.5609999999999999, 8.7799999999999994]
[5.0, 50.0]

In [6]:
model = linear_model.LinearRegression(normalize=False, fit_intercept=True)

num_observ = len(dataset)
x = dataset['RM'].values.reshape((num_observ, 1)) # X deve ser uma matriz
y = dataset['target'].values # Y pode ser um vetor

model.fit(x, y)

predicts = model.predict(x)

In [7]:
scatter_plot = dataset.plot(kind='scatter', x='RM', y='target', xlim=x_range, ylim=y_range)
regression_line = scatter_plot.plot(
    dataset['RM'], predicts, '-', color='orange', linewidth=2
)



In [8]:
print(model.coef_)
print(model.intercept_)


[ 9.10210898]
-34.6706207764


In [10]:
sum_squared_regression = pd.Series(predicts - dataset['target'].mean())**2
SSR = np.sum(sum_squared_regression)
print('Soma dos quadrados da regressão (SSR):', SSR)


Soma dos quadrados da regressão (SSR): 20654.416218807968

In [18]:
sum_squared_errors = pd.Series(predicts - dataset['target'])**2
SSE = np.sum(sum_squared_errors)
print('Soma dos quadrados dos erros (SSE):', SSE)


Soma dos quadrados dos erros (SSE): 22061.879196211805

In [21]:
SST = (SSE + SSR)
print('SSE + SSR = SST', SST)


SSE + SSR = SST 42716.29541501978

In [22]:
R2 = 1 - SSE / SST
print('R² = 1 - SSE / SST:', R2)


R² = 1 - SSE / SST: 0.4835254559913341

In [23]:
print('Valores esperados: \n', dataset['target'].values[0:10])
print('Valores previstos: \n', predicts[:10])


Valores esperados: 
 [ 24.   21.6  34.7  33.4  36.2  28.7  22.9  27.1  16.5  18.9]
Valores previstos: 
 [ 25.17574577  23.77402099  30.72803225  29.02593787  30.38215211
  23.85593997  20.05125842  21.50759586  16.5833549   19.97844155]